package com.sense.kukoo.common.wiget.adapter;

import android.util.SparseArray;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;


import com.sense.kukoo.common.wiget.adapter.provider.MultiItemProvider;
import com.sense.kukoo.common.wiget.adapter.viewholder.BaseViewHolder;

import org.jetbrains.annotations.NotNull;

import java.util.List;

/**
 * # 多类型Adapter
 *
 * ## 具体用法步骤
 * 1. 根据所需业务继承 EduMultiItemAdapter
 *    * 构造方法中注册组件
 *    * getItemType返回具体组件类型
 * 2. 具体业务组件继承MultiItemProvider
 *    * 返回业务组件类型getItemType
 *    * 返回业务布局getItemLayoutId
 *    * 具体业务逻辑onBindViewHolder
 * 3. 其他都和正常adapter一样使用了
 * 4. 支持自定义loadmore
 *    * 继承EduBaseLoadMore
 *    * 实现各个状态布局
 * @param <T>
 */
public abstract class MultiItemAdapter<T> extends BaseAdapter<T> {
    private SparseArray<MultiItemProvider<T>> mItemProviders = new SparseArray<>();

    public MultiItemAdapter(@Nullable List<T> data) {
        super(data);
    }

    @Override
    protected void onBindViewHolder(BaseViewHolder holder, T item) {
        if (getItemProvider(holder.getItemViewType()) == null){
            return;
        }
        getItemProvider(holder.getItemViewType()).onBindViewHolder(holder,item);
    }

    /**
     * 添加组件 key为ItemType，value为自定义的组件。
     * @param provider 自定义的组件
     */
    public void addItemProvider(MultiItemProvider<T> provider){
        mItemProviders.put(provider.getItemType(),provider);
    }

    /**
     * 通过 ViewType 获取 BaseItemProvider
     * 例如：如果ViewType经过特殊处理，可以重写此方法，获取正确的Provider
     *
     * @param viewType Int
     * @return BaseItemProvider
     */
    protected MultiItemProvider<T> getItemProvider(int viewType) {
        return mItemProviders.get(viewType);
    }

    @NotNull
    @Override
    protected BaseViewHolder onCreateDefViewHolder(@NotNull ViewGroup parent, int viewType) {
        MultiItemProvider<T> provider = getItemProvider(viewType);
        if (provider != null){
            return provider.onCreateViewHolder(parent,viewType);
        }else{
            throw new RuntimeException("ViewType: "+viewType +" no such provider found，please use addItemProvider() first!");
        }
    }

    @Override
    public void onViewDetachedFromWindow(@NonNull BaseViewHolder holder) {
        if (holder.getItemViewType() != LOADMORE_VIEW){
            getItemProvider(holder.getItemViewType()).onViewDetachedFromWindow(holder);
        }
    }

    @Override
    public void onViewAttachedToWindow(@NonNull BaseViewHolder holder) {
        if (holder.getItemViewType() != LOADMORE_VIEW) {
            getItemProvider(holder.getItemViewType()).onViewAttachedToWindow(holder);
        }
    }

    /**
     * 返回对应的itemType 这个type对应的key在 {@link #addItemProvider}
     * @param data
     * @param position
     * @return
     */
    protected abstract int getItemType(List<T> data,int position);


    @Override
    protected int getDefItemViewType(int position) {
        return getItemType(mData,position);
    }
}
